/**
 * 四海兄弟工作小组，群号:160517807
 * @author 乔继承
 * @date 2013年9月23日 下午10:01:32 
 * @version V1.0   
 */
package org.mcpro.core.model;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.mcpro.common.util.IDFactory;
import org.mcpro.common.util.ObjectUtil;

/**
 * 描述对象的类
 * 
 * @author 乔继承
 * @date 2013年9月23日 下午9:55:54
 * 
 */
public class DictObject {
	private String id;
	private String sobjectName;// 对象的名称
	private String suiName;// 对象的页面显示名称，这里目前没有考虑国际化
	private String snote;// 对象的业务描述
	private String stableName;// 对象所对于的表名
	private List<String> fields = new ArrayList<String>();
	private List<DictObject2field> dictObject2fields = new ArrayList<DictObject2field>();// 对象字段的描述
	private List<Map<String, String>> dictObjectValues = new ArrayList<Map<String, String>>();// 对象的值

	public DictObject() {

	}

	/**
	 * 根据dictObject的相关属性构造dictObject对象
	 * 
	 * @param id
	 * @param sobjectName
	 * @param suiName
	 * @param snote
	 * @param stableName
	 */
	public DictObject(String id, String sobjectName, String suiName,
			String snote, String stableName) {
		super();
		this.id = id;
		this.sobjectName = sobjectName;
		this.suiName = suiName;
		this.snote = snote;
		this.stableName = stableName;
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	/**
	 * 获取对象的名称
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:19:30
	 */
	public String getSobjectName() {
		return sobjectName;
	}

	/**
	 * 获取对象的值
	 * 
	 * @param sobjectName
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:19:43
	 */
	public void setSobjectName(String sobjectName) {
		this.sobjectName = sobjectName;
	}

	/**
	 * 获取对象的界面名称
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:20:38
	 */
	public String getSuiName() {
		return suiName;
	}

	/**
	 * 设置对象的界面名称
	 * 
	 * @param suiName
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:21:03
	 */
	public void setSuiName(String suiName) {
		this.suiName = suiName;
	}

	/**
	 * 获取对象的备注信息
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:21:33
	 */
	public String getSnote() {
		return snote;
	}

	/**
	 * 设置对象的备注信息
	 * 
	 * @param snote
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:21:52
	 */
	public void setSnote(String snote) {
		this.snote = snote;
	}

	/**
	 * 获取对象关联的数据库表名称
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:22:17
	 */
	public String getStableName() {
		return stableName;
	}

	/**
	 * 设置对象的数据库表名称
	 * 
	 * @param stableName
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:23:08
	 */
	public void setStableName(String stableName) {
		this.stableName = stableName;
	}

	/**
	 * 获取对象的字段详细信息
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:25:54
	 */
	public List<DictObject2field> getDictObject2fields() {
		return dictObject2fields;
	}

	/**
	 * 设置对象字段的详细信息
	 * 
	 * @param dictObject2fields
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:27:18
	 */
	public void setDictObject2fields(List<DictObject2field> dictObject2fields) {
		this.dictObject2fields = dictObject2fields;
	}

	public List<String> getFields() {
		return fields;
	}

	public void setFields(List<String> fields) {
		this.fields = fields;
	}

	/**
	 * 获取对象值的详细信息
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:28:09
	 */
	public List<Map<String, String>> getDictObjectValues() {
		return dictObjectValues;
	}

	/**
	 * 设置对象值的详细信息
	 * 
	 * @param dictObjectValues
	 * @author 乔继承
	 * @date 2014年3月3日 下午10:28:28
	 */
	public void setDictObjectValues(List<Map<String, String>> dictObjectValues) {
		this.dictObjectValues = dictObjectValues;
	}

	/**
	 * 获取建表的主键信息
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月22日 下午4:35:16
	 */
	public DictObject getPrimaryKey() {
		DictObject2field dictObject2field = new DictObject2field();
		dictObject2field.getPrimaryKeyDictObject();
		if (ObjectUtil.isEmpty(id)) {
			id = IDFactory.getNumberid();
		}
		dictObject2field.setIdObject(this.id);
		this.getDictObject2fields().add(dictObject2field);
		return this;
	}

	/**
	 * 根据当前对象的状态获取相应的建表语句
	 * 
	 * @param dictobj
	 * @return
	 * @author 乔继承
	 * @date 2014年1月18日 下午2:01:43
	 */
	public String getCreateTableSql() {
		StringBuffer sql = new StringBuffer();
		if (ObjectUtil.isEmpty(stableName)) {
			return null;
		}

		sql.append("create table `").append(stableName).append("`(\n\t");
		StringBuffer primarykey = new StringBuffer("primary key (");
		if (ObjectUtil.isEmpty(dictObject2fields)) {
			sql.append("`id` varchar(32) not null,\n\t").append(primarykey)
					.append("`id`))");
			return sql.toString();
		}
		for (DictObject2field dof : dictObject2fields) {
			sql.append("`").append(dof.getSfieldName()).append("` ")
					.append(dof.getSdbtype());
			if (dof.getIfieldLength() > 0) {
				sql.append(" (").append(dof.getIfieldLength()).append(")");
			}
			if (!dof.getBisNull()) {
				sql.append(" not null");
			}
			if (!ObjectUtil.isEmpty(dof.getDefaultValue())) {
				sql.append(" default ").append(dof.getDefaultValue());
			}
			if (!ObjectUtil.isEmpty(dof.getSnote())) {
				sql.append(" comment '").append(dof.getSnote()).append("'");
			}
			sql.append(",").append("\n\t");
			if (dof.getBprimaryKey()) {
				primarykey.append("`").append(dof.getSfieldName()).append("`,");
			}
		}
		sql.append(primarykey.subSequence(0, primarykey.length() - 1)).append(
				")\n)");
		return sql.toString();
	}

	/**
	 * 根据当前对象的状态获取其插入到dict_object中的相关sql语句
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月4日 下午10:42:43
	 */
	public String getInsertDictObjectSql() {
		if (ObjectUtil.isEmpty(sobjectName) || ObjectUtil.isEmpty(suiName)
				|| ObjectUtil.isEmpty(stableName)) {
			return null;
		}
		StringBuffer sql = new StringBuffer();
		if (ObjectUtil.isEmpty(id)) {
			id = IDFactory.getNumberid();
		}
		sql.append(
				"insert into dict_object(`id`,`sobjectName`,`suiName`,`stableName`,`snote`)values(")
				.append("'").append(id).append("',").append("'")
				.append(sobjectName).append("',").append("'").append(suiName)
				.append("',").append("'").append(stableName).append("',")
				.append("'").append(snote).append("')");
		return sql.toString();
	}

	/**
	 * 根据对象的当前状态获取其插入到dict_obejct2field中相关sql语句的集合
	 * 
	 * @return
	 * @author 乔继承
	 * @date 2014年3月4日 下午10:44:43
	 */
	public List<String> getInsertDictObject2FieldSqls() {
		if (ObjectUtil.isEmpty(dictObject2fields)) {
			return null;
		}
		String sql = null;
		if (ObjectUtil.isEmpty(id)) {
			id = IDFactory.getNumberid();
		}
		List<String> sqls = new ArrayList<String>();

		for (DictObject2field dof : dictObject2fields) {
			if (ObjectUtil.isEmpty(dof)) {
				continue;
			}
			if (ObjectUtil.isEmpty(dof.getId())) {
				dof.setId(IDFactory.getNumberid());
			}
			if (ObjectUtil.isEmpty(dof.getIdObject())) {
				dof.setIdObject(id);
			}
			sql = dof.getInsertDictObject2FieldSql();
			if (ObjectUtil.isNotEmpty(sql)) {
				sqls.add(sql);
			}
		}
		return sqls;
	}

}
